タグによるアクセス制御のロールをgcloudコマンドで付与する際の注意点
はじめに
データアナリティクス事業本部のkobayashiです。
gloudコマンドのadd-iam-policy-bindingでプリンシパルにロールを付与する際にconditionの指定の仕方で少しハマったのでまとめます。
- gcloud topic escaping | Google Cloud CLI Documentation
- gcloud projects add-iam-policy-binding | Google Cloud CLI Documentation
コマンド実行でハマった内容と解決策
失敗したコマンド実行例
実行しようとして失敗したコマンドは タグと条件付きアクセス | IAM のドキュメント | Google Cloud にある「名前空間と略称を利用する条件」をIAMにてロールを付与するコマンドになります。コマンドはタグキーenv
のタグ値prod
を持つリソースだけを読み取る条件付きロールになります。
このコマンドを以下の形で実行するとエラーが発生してしまいました。
$ gcloud projects add-iam-policy-binding example-project-id-1 \
--member='user:[email protected]'\
--role="roles/bigquery.dataViewer" \
--condition="expression=resource.matchTag('123456789012/env', 'prod'),title=Access only to tag,description=Grants access only to resources with specified tag"
ERROR: (gcloud.projects.add-iam-policy-binding) argument --condition: valid keys are [None, description, expression, title]; received: 'prod')
Google Cloudのコンソール画面から同様のロールを追加してからgcloud projects get-iam-policy
コマンドで出力された値が
- condition:
description: Grants access only to resources with specified tag
expression: resource.matchTag('123456789012/env','prod')
title: Access only to tag
だったため--conditin
オプションもこれをカンマ区切りで単純に結合すればよいかと誤認していました。
またタグキーだけの条件の下記のコマンドは問題なく成功していたため少し悩みました。
$ gcloud projects add-iam-policy-binding example-project-id-1 \
--member='user:[email protected]'\
--role="roles/bigquery.dataViewer" \
--condition="expression=resource.hasTagKey('123456789012/env'),title=Access only to tag key,description=Grants access only to resources with specified tag key"
解決策
そこで改めてgcloud projects add-iam-policy-binding
のドキュメントを見返したところ--conditin
オプションに以下の説明がありました。
If the condition expression includes a comma, use a different delimiter to separate the key-value pairs. Specify the delimiter before listing the key-value pairs. For example, to specify a colon (:) as the delimiter, do the following: --condition=^:^title=TITLE:expression=EXPRESSION. For more information, see https://cloud.google.com/sdk/gcloud/reference/topic/escaping.
これからわかった問題点はresource.matchTag('123456789012/env', 'prod')
の条件の中にカンマ,
が含まれていることでしたので gcloud topic escaping | Google Cloud CLI Documentation を参考に以下のように項目の区切りを^:^
と先頭で指定してから区切りをカンマ,
からコロン:
に書き換えたところ問題なくコマンドが成功するようになりました。
$ gcloud projects add-iam-policy-binding example-project-id-1 \
--member='user:[email protected]'\
--role="roles/bigquery.dataViewer" \
--condition="^:^expression=resource.matchTag('123456789012/env', 'prod'):title=Access only to tag:description=Grants access only to resources with specified tag"
これ以外の解決策としては--conditin
オプションではなく--condition-from-fil
オプションで条件部分をファイルから読み込むことでも解決できます。
$ gcloud projects add-iam-policy-binding example-project-id-1 \
--member='user:[email protected]'\
--role="roles/bigquery.dataViewer" \
--condition-from-file=policy.yaml
description: Grants access only to resources with specified tag
expression: resource.matchTag('123456789012/env','prod')
title: Access only to tag
まとめ
gloudコマンドのadd-iam-policy-bindingでプリンシパルにロールを付与する際にconditionの中にカンマ,
を含む条件がある場合の解決方法をまとめました。同じエラーで悩んでいる方のお役にたてれば幸いです。
最後まで読んで頂いてありがとうございました。